Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 28 Feb 2010 18:04:18 -0500
From:      George Neville-Neil <gnn@neville-neil.com>
To:        Joseph Koshy <jkoshy@freebsd.org>
Cc:        embedded@freebsd.org, fabient@freebsd.org
Subject:   Re: First cut at hwpmc support on MIPS
Message-ID:  <4FDD422C-DF35-4FFC-9D3F-77801574DCB9@neville-neil.com>
In-Reply-To: <861vg54mr7.wl%koshy@unixconsulting.co.in>
References:  <42B59FCC-7A59-4383-BE4E-366B80B504BF@neville-neil.com> <867hqa9d0h.wl%koshy@unixconsulting.co.in> <3BF42672-9790-4D7F-9723-3D80601930B7@neville-neil.com> <861vg54mr7.wl%koshy@unixconsulting.co.in>

next in thread | previous in thread | raw e-mail | index | archive | help

On Feb 28, 2010, at 06:36 , Joseph Koshy wrote:

>=20
>>> 7) =46rom the definitions in the header file, these PMCs appear to
>>>  support the concept of sampling based on processor mode:
>>>=20
>>> +#define MIPS_PMC_USER_ENABLE           0x08    /* Count in USER =
mode */
>>> +#define MIPS_PMC_SUPER_ENABLE          0x04    /* Count in =
SUPERVISOR mode */
>>> +#define MIPS_PMC_KERNEL_ENABLE         0x02    /* Count in KERNEL =
mode */
>>>=20
>>>  If that is the case, then you should support those modifiers in
>>>  libpmc's event parsing.  The libpmc code in the patch appears to be
>>>  a stub:
>>>=20
>>> +static int
>>> +mips_allocate_pmc(enum pmc_event pe, char *ctrspec __unused,
>>> +                 struct pmc_op_pmcallocate *pmc_config __unused)
>>> +{
>>> +       switch (pe) {
>>> +       default:
>>> +               break;
>>> +       }
>>> +      =20
>>> +       return (0);
>>> +}
>>>=20
>>>=20
>> Is there any other processor that does this?  Right now I make the =
chip
>> sample in all modes by fiat.
>=20
> All the Intel and AMD PMCs: see the handling of the "usr" and "os"
> qualifiers.
>=20

OK, done.

>>> 8) You can reduce the size of the following table in "hwpmc_mips.c",
>>>  by treating the pe_counter field as a set of flags.
>>>=20
>>> +struct mips_event_code_map {
>>> +       enum pmc_event  pe_ev;      /* enum value */
>>> +       uint8_t         pe_counter; /* Which counter this can be =
counted in. */
>>> +       uint8_t         pe_code;    /* numeric code */
>>> +};
>>>=20
>>> +const struct mips_event_code_map mips_event_codes[] =3D {
>>> +       { PMC_EV_MIPS_CYCLE, 0, 0},
>>> +       { PMC_EV_MIPS_CYCLE, 1, 0},  <<<--- repeated information=20
>=20
> Most Intel CPUs have restrictions on the events that PMCs support.
> You may want to look at the P6, or Intel Core support code for =
examples.
>=20
>>> 9) You'd want to support flags that control counting based on
>>>  processor modes.  For this, you would want to pass down flags
>>>  from userland and change the `pm_mips_evsel' field to suit:
>>>=20
>>> +static int
>>> +mips_allocate_pmc(int cpu, int ri, struct pmc *pm,
>>> +  const struct pmc_op_pmcallocate *a)
>>> +{
>>> ...
>>> +       pm->pm_md.pm_mips.pm_mips_evsel =3D config;
>>>=20
>=20
>> Again, for both of these, is there an example I should work from?
>=20
> See P6, Pentium IV, AMD, Intel Core for examples.
>=20

Done.

> Additional comments on patch #3:
>=20
> * The manual page still has UTF 8.  E.g.,-
> +Count all pipeline bubbles that are a result of multicycle ISPRAM
> +access. Pipeline bubbles are defined as all cycles that IFU =
doesn<E2><80><99>t
> +present an instruction to ALU. The four cycles after a redirect are
> * The convention is that sentences always start on a new line in
>   -mdoc input.

Fixed.

Thanks,
George




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4FDD422C-DF35-4FFC-9D3F-77801574DCB9>